//4个学生，5门课程,每个学生都有五门课程的成绩，可以搞一个一维指针数组来存放
#include<stdio.h>
int main(void)
{
    void avg(float *,float *);//学生平均成绩
    void avcour1(char(*)[10],float *);//第一门课平均成绩
    void fail2(char course[5][10],int num[ ],float *pscore,float aver[4]);//2门不及格的学生学号与成绩
    void good(char course[5][10],int num[4],float *pscore,float aver[4]);//成绩优秀的学生学号与成绩
    int i,j,*pnum,num[4];
    float score[4][5],aver[4],*pscore,*paver;//定义学生成绩为二维数组，平均分为一维数组，一个指向成绩的指针，一个指向平均分的指针
    char course[5][10],(*pcourse)[10];//5门课程也作为一个二维数组
    printf("input course:\n");//先输入课程名称
    pcourse=course;//数组course的入口给了这个指针
    for(i=0;i<5;i++)
        scanf("%s",course[i]);
    printf("input No.and course:\n");
    printf("No.");
    for(i=0;i<5;i++)
        printf("  %s  ",course[i]);
    printf("\n");
    pscore=&score[0][0];//使得指针指向二维数组的初始位置
    pnum=&num[0];
    for(i=0;i<4;i++)
        {
            scanf("%d",pnum+i);//输入每个学生的学号
            for(j=0;j<5;j++)
                scanf("%f",pscore+5*i+j);//输入每个学生的成绩
        }

    paver=&aver[0];
    printf("\n\n");
    avg(pscore,paver);//求每个学生的平均成绩
    avcour1(pcourse,pscore);//求第一门课的学生平均成绩
    printf("\n\n");
    fail2(pcourse,pnum,pscore,paver);//输出有两门以上课程不及格的学生，输出他们的学号和全部课程成绩以及平均分
    printf("\n\n");
    good(pcourse,pnum,pscore,paver);//输出平均成绩在90分以上的学生详细信息
    return 0;//main()函数到这里就截止了，开始为上面调用的函数编写定义
}
void avg(float *pscore,float *paver)//求每个学生的平均成绩
{
    int i,j;
    float sum,average;//二维数组求和都可以使用这个方法
    for(i=0;i<4;i++)
        {
            sum=0.0;
            for(j=0;j<5;j++)
                sum=sum+(*(pscore+5*i+j));//每一行再单独和sum加
                average=sum/5;
                *(paver+i)=average;
        }

}
void avcour1(char (*pcourse)[10],float *pscore)//计算第一门课程的平均分
{
    int i;
    float sum,averge1;
    sum=0.0;
    for(i=0;i<4;i++)
        sum=sum+(*(pscore+5*i));//有四个学生，把四个学生的第一门课程的成绩加起来就完事了，score是4X5的数列,0,5,10,15都在第一列
    averge1=sum/4;
    printf("course 1:%s average score:%7.2f\n",*pcourse,averge1);
}
void fail2(char course[5][10],int num[ ],float *pscore,float aver[4])//如果有两名学生不及格，输出他们的所有信息
{
    int i,j,k,label;
    printf("=====================student who is fall two courses===================\n");
    printf("NO. ");
    for(i=0;i<5;i++)
        printf("%11s",course[i]);//输出课程名称
    printf("      average\n");
    for(i=0;i<4;i++)
    {
        label=0;
        for(j=0;j<5;j++)
        if(*(pscore+5*i+j)<60.0) 
        label++;
        if(label>=2)//不及格人数大于等于两人时
        {
            printf("%d",num[i]);
            for(k=0;k<5;k++)
                printf("%11.2f",*(pscore+5*i+k));//不及格人数的五门课程,i代表了不及格同学的下标号
            printf("%11.2f\n",aver[i]);
        }
    }   

}
void good(char course[5][10],int num[4],float*pscore,float aver[4])//查找成绩优秀的学生(>85或>90)
{
    int i,j,k,n;
    printf("============students whose score is good=============\n");
    printf("NO.");
    for(i=0;i<5;i++)
        printf("%11s",course[i]);//先得把这五门课程的编号打印出来，0，1，2，3，4五门课程编号
    printf("average\n");
    for(i=0;i<4;i++)//0，1，2，3四个学生//循环往下走，按照顺序比较每名学生的每门课程
    {
        n=0;
        for(j=0;j<5;j++)//0，1，2，3，4五门课程
            if(*(pscore+5*i+j)>85.0) n++;//它不是4X5的数组吗，i是代表了四个学生，n++优秀的课程数目加1，这里每个课程都要比较一遍
        if((n==5)||(aver[i]>=90))//全部课程成绩在85分以上或者平均成绩在90分以上筛选条件
            {
                printf("%d",num[i]);//输出存放学号的数组
                for(k=0;k<5;k++)
                    printf("%11.2f",*(pscore+5+k));//先把五门课程的成绩输出了
                printf("%11.2f\n",aver[i]);
            }

    }
}